package com.lkd.plcs7.direct.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

@Configuration
public class ThreadPoolConfig {

    /**
     * 线程池配置
     * @return
     */
    @Bean(name = "myTaskExecutor")
    public ThreadPoolTaskExecutor myTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 对于单核CPU，核心线程数设置为1是最合理的
        executor.setCorePoolSize(1);
        // 单核CPU环境下，最大线程数通常也设置为1，避免线程切换的开销
        executor.setMaxPoolSize(1);
        // 队列大小可以根据应用的实际情况调整，如果任务产生速度远大于处理速度，可能需要适当增大队列
        executor.setQueueCapacity(200);
        executor.setThreadNamePrefix("MyExecutor-");
        // 在单核CPU上，空闲线程存活时间的设置意义不大，因为通常只会有一个线程在运行
        executor.setKeepAliveSeconds(60);
        // 使用CallerRunsPolicy策略可以确保在任务队列满时，任务由调用线程执行，避免任务被拒绝
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.initialize(); // 显式初始化
        return executor;
    }
}
